package com.example.mytest.controller;

import com.example.mytest.Exception.ResultBody;
import com.example.mytest.annotation1.User;
import com.example.mytest.annotation2.PermissionCheck;
import com.example.mytest.annotation3.CustomCache;
import com.example.mytest.annotation4.PathRestController;
import com.example.mytest.annotation4.TransactionalService;
import org.springframework.core.annotation.AliasFor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassName: TestController
 * @Description: TODO
 * @Author: 230689
 * @Date: 2021/9/3 15:59
 * @Version: v1.0
 */

//@RestController
//@RequestMapping(value = "/api")
@PathRestController(value = "/api")
public class TestController {

    /*
    验证器自定义注解，该方式可以用于入参校验。
     */
    @PostMapping("/test1")
    public ResultBody test(@Validated @RequestBody User user) {
        return ResultBody.success("hello world");
    }

    /*
       拦截器自定义注解
     */
    @GetMapping("/test2")
    @PermissionCheck(resourceKey = "test")
    public ResultBody testPermissionCheck() {
        return ResultBody.success("hello world");
    }


    /*
       缓存自定义注解
     */
    @GetMapping("/test3")
    @CustomCache(key = "#id")
    public ResultBody testCustomCache(Integer id) {
        return ResultBody.success("this is a data");
    }


    /*
     注解声明别名
    */
    @GetMapping("/test4")
    @AliasFor("这是一个别名")
    public ResultBody test4() {
        //todo 在Spring的众多注解中，经常会发现很多注解的不同属性起着相同的作用，比如@RequestMapping的value属性和path属性，这就需要做一些基本的限制，
        //todo 比如value和path的值不能冲突，比如任意设置value或者设置path属性的值，都能够通过另一个属性来获取值等等。为了统一处理这些情况，Spring创建了@AliasFor标签。
       //todo AliasFor使用例子有：@RequestMapping（互为别名）  @SpringBootApplication（复合注解）  @Service（继承注解）
        return ResultBody.success();
    }


    /*
    复合注解
   */
    @GetMapping("/test5")
    @TransactionalService
    public ResultBody test5() {
        //todo 这是一个复合注解，支持 @Service 和 @Transactional 组合来进行服务层的逻辑开发，此处放在controller仅演示
        //todo 同样如 @PathRestControlle
        return ResultBody.success("");
    }


}
